package com.thinkgsp.jxc.persistence;

import java.math.BigDecimal;
import java.sql.Date;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.thinkgsp.jxc.model.Bill;
import com.thinkgsp.jxc.model.BillAmount;
import com.thinkgsp.jxc.model.BillDetail;
import com.thinkgsp.jxc.model.BillExtend;

/**
 * 出入库单据持久化类
 * @author evan
 *
 */
public interface BillMapper {

	/**
	 * 根据单据获取单据主体
	 * @param billId 单据Id
	 * @return
	 */
	public Bill getBill(Long billId);
	
	/**
	 * 查询单据列表
	 * @param billTypes 单据类型
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @return
	 */
	public <T extends Bill> List<T> getBillList(@Param(value="billTypes")List<Integer> billTypes,@Param(value="begDate")Date begDate,@Param(value="endDate")Date endDate,@Param(value="custId")Integer custId);
	
	/**
	 * 获取单据扩展
	 * @param billId 单据Id
	 * @return
	 */
	public BillExtend getBillExtend(Long billId);
	
	/**
	 * 获取单据明细
	 * @param id 明细Id
	 * @return
	 */
	public BillDetail getBillDetail(Long id);
	
	/**
	 * 根据单据Id获取单据明细列表
	 * @param billId
	 * @return
	 */
	public List<BillDetail> getBillDetailByBillId(Long billId);
	
	/**
	 * 获取单据金额
	 * @param billId
	 * @return
	 */
	public BillAmount getBillAmount(Long billId);
	
	/**
	 * 插入单据主体
	 * @param bill
	 */
	public void insertBill(Bill bill);
	
	/**
	 * 插入单据明细
	 * @param detail
	 */
	public void insertBillDetail(BillDetail detail);
	
	/**
	 * 插入单据扩展
	 * @param extend
	 */
	public void insertBillExtend(BillExtend extend);
	
	/**
	 * 更新单据主体
	 * @param bill
	 */
	public void updateBill(Bill bill);
	
	/**
	 * 更新单据明细
	 * @param detail
	 */
	public void updateBillDetail(BillDetail detail);
	
	public void updateBillDetailCostPrice(@Param("detailId")Long detailId,@Param("costPrice")BigDecimal costPrice);
	
	/**
	 * 更新单据扩展
	 * @param extend
	 */
	public void updateBillExtend(BillExtend extend);
	
	/**
	 * 更新删除标志
	 * @param billId
	 * @param deleted
	 */
	public void updateDeleted(@Param(value="billId")Long billId,@Param(value="deleted")Boolean deleted);
	
	/**
	 * 删除单据,如果从未归档的单据可以直接删除,否则只能修改删除标志;
	 * 因为，已归档的单据并且反归档的单据有记录商品流水，所以不能直接删除
	 * @param billId
	 */
	public Integer deleteBill(Long billId);
	
	/**
	 * 删除单据明细
	 * @param detailId
	 */
	public Integer deleteBillDetailById(Long detailId);
	
	/**
	 * 删除数据库中存在，但在单据明细中不存在的记录
	 * @param billId
	 * @param details
	 * @return
	 */
	public int deleteBillDetailNotIn(@Param(value="billId")Long billId,@Param(value="details")List<BillDetail> details);
	
	/**
	 * 根据单据Id删除单据明细
	 * @param billId
	 * @return
	 */
	public Integer deleteBillDetailByBillId(Long billId);
	
	/**
	 * 删除单据扩展
	 * @param billId
	 */
	public Integer deleteBillExtend(Long billId);
	
	/**
	 * 单据归档
	 * @param billid 单据Id
	 * @param archived true 为归档;false 反归档
	 */
	public void archiveBill(@Param(value="billId")Long billId,@Param(value="archived")Boolean archived);
}
